package config

import (
	"fmt"
	"github.com/spf13/viper"
	"log"
	"os"
)

type Config struct {
	Domain       string    `mapstructure:"default_domain"`
	Port         int       `mapstructure:"server_port"`
	DataCenterId int64     `mapstructure:"data_center_id"`
	DataWorkId   int64     `mapstructure:"data_work_id"`
	Database     DbConf    `mapstructure:"database"` // 指定嵌套路径
	RedisConf    RedisConf `mapstructure:"redis"`    // 指定嵌套路径

}

type DbConf struct {
	Host     string `mapstructure:"host"`
	Port     int    `mapstructure:"port"`
	Username string `mapstructure:"username"`
	Password string `mapstructure:"password"`
}

type RedisConf struct {
	Host     string `mapstructure:"host"`
	Port     int    `mapstructure:"port"`
	Database int    `mapstructure:"database"`
	Password string `mapstructure:"password"`
}

type ConfigManager struct {
	config *Config
}

func NewConfigManager() (*ConfigManager, error) {
	cm := &ConfigManager{}
	// 设置默认值
	viper.SetDefault("default_domain", "127.0.0.1:8080")
	viper.SetDefault("server_port", "8080")

	env := os.Getenv("ENV") // ENV=dev 或 ENV=prod
	if env == "" {
		env = "dev"
	}
	viper.SetConfigName("config." + env) // 优先加载 config.dev.yaml
	viper.AddConfigPath("config")
	viper.AddConfigPath(".")
	// 正确加载 YAML 配置文件（如果存在）
	if err := viper.ReadInConfig(); err != nil {
		if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
			return nil, fmt.Errorf("error reading config file: %w", err)
		}
		log.Println("Config file not found, using defaults...")
	}
	// 绑定
	if err := viper.Unmarshal(&cm.config); err != nil {
		return nil, err
	}
	return cm, nil
}

// GetConfig 返回当前配置快照（并发安全：返回副本或只读）
func (cm *ConfigManager) GetConfig() *Config {
	return cm.config
}
